//
//  WDChapter5.c
//  ProjectM
//
//  Created by gaofeng on 2021/7/12.
//

#include "WDChapter5.h"

#include <stdlib.h>
void runChapter5(void){
    printf("runChapter5\n");
    MGraph *mg = initGraph();
    int ret = AdjacentMGraph(mg, '1', '1');
    printf("ret = %d",ret);
//    int a = mg->Edge[2][2];
//    int b = mg->Edge[0][1];
//    int c = mg->Edge[3][0];
//    printf("%d %d %d\n",a,b,c);
//    ALGraph *alg = initALGraph();
//    MGraph *mg = initSpaceMGraph();
//    convert(alg, mg);
//    printf("%d %d\n",mg->vexnum,mg->arcnum);
//    int a = mg->Edge[0][1];
//    int c = mg->Edge[2][4];
//    printf("%d %d",a,c);
//    VNode n1 = alg->vertices[0];
//    ArcNode *c1 = n1.first;
//    printf("%d ",n1.data);
//    while (c1) {
//        printf("%d  ",c1->adjvex);
//        c1=c1->next;
//    }
}

void convert(ALGraph *alg, MGraph *mg){
    mg->vexnum = alg->vexnum;
    mg->arcnum = alg->arcnum;
    int n = alg->vexnum;
    ArcNode *p;
    for (int i=0; i<n; i++) {
        p = alg->vertices[i].first;
        while (p!=NULL) {
            mg->Edge[i][p->adjvex-1]=1;
            p=p->next;
        }
    }
}
ALGraph *initALGraph(void){
    ALGraph *alg = malloc(sizeof(ALGraph));
    alg->vexnum = 5; alg->arcnum = 16;
    ArcNode *c3 =initArcNode(4, NULL);
    ArcNode *c2 =initArcNode(3, c3);
    ArcNode *c1 =initArcNode(2, c2);
    VNode n1 = {1,c1};
    alg->vertices[0]=n1;
    
    ArcNode *c24=initArcNode(5,NULL);
    ArcNode *c23=initArcNode(4,c24);
    ArcNode *c22=initArcNode(3,c23);
    ArcNode *c21=initArcNode(1,c22);
    VNode n2 ={2,c21};
    alg->vertices[1]=n2;
    
    ArcNode *c33=initArcNode(4,NULL);
    ArcNode *c32=initArcNode(2,c33);
    ArcNode *c31=initArcNode(1,c32);
    VNode n3={3,c31};
    alg->vertices[2]=n3;
    
    ArcNode *c44=initArcNode(5,NULL);
    ArcNode *c43=initArcNode(3,c44);
    ArcNode *c42=initArcNode(2,c43);
    ArcNode *c41=initArcNode(1,c42);
    VNode n4 = {4,c41};
    alg->vertices[3]=n4;
    
    ArcNode *c52=initArcNode(4,NULL);
    ArcNode *c51=initArcNode(2,c52);
    VNode n5 = {5,c51};
    alg->vertices[4]= n5;
    return  alg;
}
/** 6阶矩阵
 * 0  1   2   3  4  5  6
 * 0  15  2  12  ∞  ∞  ∞
 * ∞  0   ∞   ∞  6  ∞  ∞
 * ∞  ∞   0   ∞  8  4  ∞
 * ∞  ∞   ∞   0  ∞  ∞  3
 * ∞  ∞   ∞   ∞  0  ∞  9
 * ∞  ∞   ∞   5  ∞  0  10
 * ∞  4   ∞   ∞  ∞  ∞  0
 */
MGraph *initGraph(void){
    MGraph *mg = malloc(sizeof(MGraph));
    mg->vexnum = 7;
    mg->arcnum = 11;
    for (int i=0; i < mg->vexnum; i++) {
        mg->Vex[i]= 49+i;
    }
    for (int i=0; i < mg->vexnum; i++) {
        for (int j=0; j<mg->vexnum; j++) {
            if (i==j) {
                mg->Edge[i][i] = 0;
            }else{
                mg->Edge[i][j] = -1;
            }
        }
    }
    mg->Edge[0][1]=15;mg->Edge[0][2]=2;mg->Edge[0][3]=12;
    mg->Edge[1][4]=6;
    mg->Edge[2][4]=8;mg->Edge[2][5]=4;
    mg->Edge[3][6]=3;
    mg->Edge[4][6]=8;
    mg->Edge[5][3]=5;mg->Edge[5][6]=10;
    mg->Edge[6][1]=4;
    
    return  mg;
}
